package info.motteke.mixivoice4j;

import java.util.Date;

/**
 * 更新戦略を表すインターフェースです。
 *
 * @author Y.Wakamatsu
 *
 */
public interface UpdateStrategy {

    /**
     * 更新方法を返します。
     *
     * @param previousUpdate
     * @return
     */
    public Plan getUpdatePlan(UpdateInfo previousUpdate);

    /**
     * 更新の単位を表す列挙体です。
     *
     * @author Y.Wakamatsu
     */
    public enum UpdateUnit {
        /** ページ単位での更新を表します。 */
        PAGE,
        /** 日付単位での更新を表します。 */
        DATE;
    }

    /**
     * 更新方法を表すクラスです。
     *
     * {@link MixiVoice#update(UpdateStrategy)}は、この更新方法に従って更新を行います。
     *
     * @author Y.Wakamatsu
     */
    public static final class Plan {

        /** 更新単位です。 */
        private final UpdateUnit unit;

        /** ページ単位で更新する場合のページ数です。 */
        private final int page;

        /** つぶやき更新時の基準日時です。 */
        private final Date date;

        /**
         * コンストラクタです。
         *
         * @param unit 更新単位です。
         * @param page 更新するページ数です。
         * @param date つぶやき更新時の基準日時。
         */
        public Plan(UpdateUnit unit, int page, Date date) {
            this.unit = unit;
            this.page = page;
            this.date = date;
        }

        /**
         * 更新単位を取得します。
         *
         * @return 更新単位
         */
        public UpdateUnit getUnit() {
            return unit;
        }

        /**
         * 更新するページ数を取得します。
         *
         * @return 更新するページ数
         */
        public int getPage() {
            return page;
        }

        /**
         * 基準にする日付を取得します。
         *
         * @return つぶやき更新時の基準日時
         */
        public Date getDate() {
            return date;
        }

    }
}
